Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

-1

367
Vistas
Node.js: Sondeo largo con EventEmitter y Express 4.x | Cierre de solicitud de captura

Estoy sondeando largamente la ruta node.js con la solicitud ajax de JQuery (xhr). Esto envía una solicitud GET a mi servidor Express y escucha los eventos del bus de mensajes. Estoy configurando un tiempo de espera en esa solicitud GET (ya que mi proxy eliminaría las solicitudes largas). Entonces, después del tiempo de espera, el cliente debe enviar un evento de cancelación al servidor.

Quiero capturar ese evento de cancelación/cierre/finalización y eliminar el oyente/suscriptor del bus de mensajes relevante.

Pero lucho. Probé req.on("close"..) y el módulo npm terminado, pero eso no funcionó para mí. Tampoco soy mucho más inteligente después de leer la documentación http del nodo: https://nodejs.org/api/http.html .

¿Alguna idea de cómo hacer frente a esta bestia? ¿O mejores formas de eliminar a los oyentes para evitar pérdidas de memoria?

Elementos esenciales del lado del servidor:

 // server.js var express = require("express"); var EventEmitter = require("events").EventEmitter; var messageBus = new EventEmitter(); messageBus.setMaxListeners(20); var REST_PORT = (process.env.PORT || 5000); var app = express(); app.get("/events", (req, res) => { var listener = function(res) { messageBus.once("message", function(data) { res.status(200).json(data); }); }; req.on("abort", function() { //I tried also "aborted", "close", "closed", "finish", "finished"..no luck messageBus.removeListener("message", listener); }); listener(res); console.log("Total listeners to 'message' events:", messageBus.listeners("message").length); }); // other messageBus.emit logic .. app.listen(REST_PORT, () => { console.log("Application ready on port " + REST_PORT); });

Elementos esenciales del lado del cliente:

 //client.js $.ajax({ method: "GET", async: true, url: "/events", success: function(data) { callback(data); }, complete: function(request, status, err) { if (status == "timeout" || status == "success") { console.log("LOG: Normal long-polling timeout or successful poll, continuing."); longPoll(); } else { console.warn("WARN: Server probably offline, retrying in 2 sec."); setTimeout(function() { longPoll(); }, 2000); } }, timeout: 30000 });

¡Gracias!

about 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Si esto ayuda a alguien, finalmente decidí implementar el sondeo largo de manera diferente y eliminar la solicitud del cliente en el lado del servidor después de cierto tiempo de espera. Esto me funciona muy bien y, después de reflexionar, es probablemente un mejor mecanismo que confiar en que el cliente cierre las solicitudes correctamente.

 setTimeout(() => { if (!responded) { messageBus.removeListener("message", listener); res.status(204).end(); } }, 30000);
about 4 years ago · Santiago Trujillo Denunciar

0

Recomiendo abortar su sistema de sondeo largo personalizado por completo y usar uno de los sistemas de mensajería/tipo socket existentes. Hay muchos que están completamente formados. socket.io sigue siendo el más popular y funciona bien, pero algunas alternativas como estas podrían ser mejores https://www.reddit.com/r/node/comments/4ktqae/socketio_alternatives/

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda